const fs = require("fs")
const path = require("path")
const express = require("express")
const { createServer } = require("vite")
const compression = require("compression")
const serveStatic = require("serve-static")

const resolve = (p) => path.resolve(__dirname, p)

async function createApp() {
  const app = express()
  // 增加运行环境判断变量
  const isProd = process.env.NODE_ENV === "production"
  console.log("Run Type => ", isProd ? "production" : "development")

  // 定义vite
  let vite
  // 获取manifest
  const manifest = fs.readFileSync(resolve("./dist/client/ssr-manifest.json"), "utf-8")

  if (isProd) {
    app.use(compression())
    app.use(serveStatic(resolve('./dist/client'), {
      index: false
    }))
  }
  else {
    // 开发模式使用中间件模式创建Vite应用
    // 使用 vite 的 Connect 实例作为中间件
    vite = await createServer({
      server: {
        middlewareMode: true
      },
      appType: "custom"
    })
    app.use(vite.middlewares)
  }


  app.use("/", async (req, res, next) => {
    const url = req.originalUrl

    try {
      let template, render
      if (isProd) {
        // 读取模板
        template = fs.readFileSync(resolve('./dist/client/index.html'), 'utf-8')
        // 加载服务器入口
        render = (await import('./dist/server/entry-server.js')).render
      }
      else {
        // 读取模板
        template = fs.readFileSync(resolve('index.html'), 'utf-8')
        // 应用 Vite HTML 转换。这将会注入 Vite HMR 客户端，同时也会从 Vite 插件应用 HTML 转换。
        template = await vite.transformIndexHtml(url, template)
        // 加载服务器入口
        render = (await vite.ssrLoadModule('/src/entry-server.ts')).render
      }

      // 渲染应用的 HTML
      const { html, preloadLinks, state } = await render(url, manifest)
      console.log("server.js =>", state)

      // 注入渲染后的应用程序 HTML 到模板中
      //.replace("<!--ssr-preload-links-->", preloadLinks)
      const appHtml = template.replace("<!--ssr-html-->", html).replace('<!--pinia-state-->', state)

      // 返回渲染后的 HTML。
      res.status(200).set({ "Content-Type": "text/html" }).end(appHtml)
    } catch (e) {
      // next()
      console.log(e)
    }
  })
  // // ssr渲染失败自动降级为csr渲染
  // app.use("/", async (req, res, next) => {
  //   try {
  //     const isProd = process.env.NODE_ENV === "production"
  //     let template
  //     if (isProd) {
  //       template = fs.readFileSync(resolve('./dist/client/index.html'), 'utf-8')
  //     }
  //     else {
  //       template = fs.readFileSync(resolve('index.html'), 'utf-8')
  //     }
  //     res.status(200).set({ "Content-Type": "text/html" }).end(template)
  //   }
  //   catch (e) {
  //     next()
  //   }
  // })
  // // 降级失败，报错500
  // app.use("/", async (req, res, next) => {
  //   res.status(500).set({ "Content-Type": "text/html" }).end()
  // })


  app.listen(3002, () => {
    console.log("SSR 渲染服务器启动成功 => http://localhost:3002/")
  })
}

createApp()